package cn.ronghuanet.base.exception.handler;

import cn.ronghuanet.base.exception.BusinessException;
import cn.ronghuanet.base.exception.ResponseCode;
import cn.ronghuanet.base.util.AjaxResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

/**
 * 全局异常处理类
 */
@RestControllerAdvice   // 这个注解是:在执行controller方法前/后面执行该类里面的代码
public class GlobalExceptionHandler {

    /**
     * 捕获处理 BusinessException
     * 当controller方法中遇到BusinessException异常时,要返回AjaxResult对象给前端
     * @param e
     */
    @ExceptionHandler(BusinessException.class)
    public AjaxResult businessExceptionHandler(BusinessException e){
        // e.printStackTrace(); 将异常信息打印到控制台
        e.printStackTrace();
        return AjaxResult.error(e.getCode(), e.getMessage());
    }

    /**
     * jsr303校验失败返回
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public AjaxResult methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
        // e.printStackTrace(); 将异常信息打印到控制台
        StringBuffer sb = new StringBuffer();
        // 获取jsr303的错误信息,拼接返回的错误信息
        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
        for (ObjectError allError : allErrors) {
            sb.append(allError.getDefaultMessage());
        }
        e.printStackTrace();
        // jsr303校验,返回给前端的应该是具体的哪一个字段有问题,所以错误信息不要取枚举类里面的
        return AjaxResult.error(ResponseCode.RESPONSE_CODE_40010.getCode(),sb.toString());
    }

    /**
     * 捕获系统异常,返回AjaxResult
     * 系统异常的错误信息应该包装后再返回
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public AjaxResult exceptionHandler(Exception e){
        e.printStackTrace();
        return AjaxResult.error(ResponseCode.RESPONSE_CODE_500.getCode(),ResponseCode.RESPONSE_CODE_500.getMessage());
    }
}
